package com.springframework.boot.common.order;


import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;


/**
 *
 *      * @RequiresAuthentication    验证用户是否登录，等同于方法subject.isAuthenticated() 结果为true时。
 *      * @RequiresUser 验证用户是否被记忆，user有两种含义：
 *      *                          一种是成功登录的（subject.isAuthenticated() 结果为true）；
 *      *                          另外一种是被记忆的（subject.isRemembered()结果为true）。
 *      * @RequiresGuest 验证是否是一个guest的请求，与@RequiresUser完全相反。 换言之，RequiresUser  == !RequiresGuest。
 *      *                 此时subject.getPrincipal() 结果为null.
 *      * @RequiresRoles   @RequiresRoles("aRoleName");
 *      *                            如果subject中有aRoleName角色才可以访问方法someMethod。
 *                                   如果没有这个权限则会抛出异常AuthorizationException。
 *      * @RequiresPermissions   @RequiresPermissions({"file:read", "write:aFile.txt"} )
 *      *                            要求subject中必须同时含有file:read和write:aFile.txt的权限才能执行方法someMethod()。
 *                                   否则抛出异常AuthorizationException。
 *      * @return
 */
@Slf4j
@Controller
@RequestMapping("order")
public class OrderController {

    @PostMapping("save")
    @RequiresRoles(value = {"admin","user"})//用来判断角色,同时具有
    @RequiresPermissions("user:update:*")
    public String save(String tokenId) {
        Subject subject = SecurityUtils.getSubject();
        if (subject.hasRole("admin")) {
            log.info("订单保存成功");
        } else {
            log.info("权限不足");
        }
        return "redirect:/index.jsp";
    }


    @PostMapping("find")
    @RequiresAuthentication
    public String find(String tokenId) {
        return "redirect:/index.jsp";
    }
}
